package com.project.srtp.secure.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.project.srtp.secure.dto.req.IdentityKeyReqDTO;
import com.project.srtp.secure.dao.entity.IdentityKeyDO;
import com.project.srtp.secure.dao.mapper.IdentityKeyMapper;
import com.project.srtp.secure.service.IdentityKeyService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author 曹行阳
 * @version 0.1
 * @date 2025/6/16 12:24
 */
@Service
public class IdentityKeyServiceImpl extends ServiceImpl<IdentityKeyMapper, IdentityKeyDO> implements IdentityKeyService {
    @Override
    @Transactional
    public void storeIdentityKey(IdentityKeyReqDTO identityKey, String userId) {
        // 构造待保存的数据对象
        IdentityKeyDO identityKeyDO = IdentityKeyDO.builder()
                .userId(userId)
                .keyId(identityKey.getId())
                .publicKey(identityKey.getPublicKey())
                .cipher(identityKey.getCipher())
                .active(true)
                .salt(identityKey.getSalt())
                .timestamp(identityKey.getTimestamp())
                .build();

        // 构造查询条件
        LambdaQueryWrapper<IdentityKeyDO> queryWrapper = Wrappers.lambdaQuery(IdentityKeyDO.class)
                .eq(IdentityKeyDO::getUserId, userId)
                .eq(IdentityKeyDO::getKeyId, identityKey.getId());

        // 查询是否已存在
        IdentityKeyDO existing = baseMapper.selectOne(queryWrapper);
        if (existing != null) {
            identityKeyDO.setId(existing.getId());
            boolean success = this.updateById(identityKeyDO);
            if (!success) {
                throw new RuntimeException("更新身份密钥失败");
            }
        } else {
            boolean success = this.save(identityKeyDO);
            if (!success) {
                throw new RuntimeException("插入身份密钥失败");
            }
        }
    }

    @Override
    public IdentityKeyDO selectIdentityKeyByUserId(String userId) {
        LambdaQueryWrapper<IdentityKeyDO> queryWrapper = Wrappers.lambdaQuery(IdentityKeyDO.class)
                .eq(IdentityKeyDO::getUserId, userId)
                .eq(IdentityKeyDO::getActive, true);
        try {
            return baseMapper.selectOne(queryWrapper);
        } catch (Exception e) {
            log.error("用户不存在");
        }
        return null;
    }
}
